Rəsmi qrammatika (EBNF)#
Alqor-un sintaksisinin formal tərifi.
ebnf
(* ===================================================================
ALQOR DİLİ — RƏSMİ QRAMMATİKA
Versiya 1.0 (layihə)
Format: ISO/IEC 14977 EBNF (genişləndirilmiş)
Qeydlər:
?...? = leksik/semantik şərh
"..." = terminal
[...] = ixtiyari (0 və ya 1)
{...} = təkrar (0 və ya daha çox)
(...) = qruplaşdırma
| = alternativ
=================================================================== *)
(* =================== 1. LEKSİK SƏVİYYƏ ======================== *)
azKiçikHərf = "a"|"b"|"c"|"ç"|"d"|"e"|"ə"|"f"|"g"|"ğ"|"h"|"x"
| "ı"|"i"|"j"|"k"|"q"|"l"|"m"|"n"|"o"|"ö"|"p"|"r"
| "s"|"ş"|"t"|"u"|"ü"|"v"|"y"|"z" ;
azBöyükHərf = "A"|"B"|"C"|"Ç"|"D"|"E"|"Ə"|"F"|"G"|"Ğ"|"H"|"X"
| "I"|"İ"|"J"|"K"|"Q"|"L"|"M"|"N"|"O"|"Ö"|"P"|"R"
| "S"|"Ş"|"T"|"U"|"Ü"|"V"|"Y"|"Z" ;
hərf = azKiçikHərf | azBöyükHərf ;
rəqəm = "0".."9" ;
onaltılıqRəqəm= rəqəm | "a".."f" | "A".."F" ;
ikilikRəqəm = "0" | "1" ;
səkkizlikRəqəm= "0".."7" ;
identifikator = ( hərf | "_" ) , { hərf | rəqəm | "_" } ;
?açar söz olmamalıdır?
boşluq = " " | "\t" ;
yeniSətir = "\n" | "\r\n" ;
şərh = sətirŞərhi | blokŞərhi | sənədŞərhi ;
sətirŞərhi = "//" , { ?yeniSətir olmayan simvol? } ;
blokŞərhi = "/*" , { blokŞərhi | ?istənilən simvol? } , "*/" ;
sənədŞərhi = "///" , { ?yeniSətir olmayan simvol? } ;
modulŞərhi = "//!" , { ?yeniSətir olmayan simvol? } ;
direktiv = "//" , boşluq* , "alqor:" , { ?yeniSətir olmayan? } ;
(* --------------------- Literallar ----------------------------- *)
tamLiteral = onluqTam | onaltılıqTam | ikilikTam | səkkizlikTam ;
onluqTam = rəqəm , { rəqəm | "_" } ;
onaltılıqTam = ( "0x" | "0X" ) , onaltılıqRəqəm , { onaltılıqRəqəm | "_" } ;
ikilikTam = ( "0b" | "0B" ) , ikilikRəqəm , { ikilikRəqəm | "_" } ;
səkkizlikTam = ( "0o" | "0O" ) , səkkizlikRəqəm , { səkkizlikRəqəm | "_" } ;
onluqLiteral = onluqTam , "." , onluqTam , [ eksponent ]
| onluqTam , eksponent ;
eksponent = ( "e" | "E" ) , [ "+" | "-" ] , onluqTam ;
mətnLiteral = sadəMətn | çoxSətirliMətn | xamMətn | baytMətn ;
sadəMətn = '"' , { mətnParçası } , '"'
| "'" , { mətnParçası } , "'" ;
mətnParçası = ?qaçış olmayan simvol? | qaçış | interpolyasiya ;
qaçış = "\\" , ( "n"|"r"|"t"|"\\"|'"'|"'"|"0"|"e"|"{"|"}"
| "u{" , onaltılıqRəqəm+ , "}"
| "x" , onaltılıqRəqəm , onaltılıqRəqəm ) ;
interpolyasiya = "{" , ifadə , [ ":" , formatSpesifikatoru ] , "}" ;
formatSpesifikatoru = { ?} olmayan simvol? } ;
çoxSətirliMətn = '"""' , { ?istənilən? } , '"""' ;
xamMətn = "x" , ( '"' , { ?" olmayan? } , '"' ) ;
baytMətn = "b" , sadəMətn ;
simvolLiteral = "`" , ( ?bir qrafem klasteri? | qaçış ) , "`" ;
məntiqLiteral = "doğru" | "yanlış" ;
boşLiteral = "boş" ;
(* ================= 2. PROQRAMIN QURULUŞU ====================== *)
proqram = [ shebang ] , { modulŞərhi } , { üstSəviyyəElement } ;
shebang = "#!" , { ?yeniSətir olmayan? } , yeniSətir ;
üstSəviyyəElement
= idxalElanı
| ixracElanı
| elan
| ifadəCümləsi
| başlanğıcBloku
| bitişBloku ;
başlanğıcBloku = "başlanğıc" , blok , son ;
bitişBloku = "bitiş" , blok , son ;
son = "son" , [ blokNövü ] ;
blokNövü = "əgər" | "funksiya" | "sinif" | "metod" | "seç"
| "təkrarla" | "hər" | "cəhd" | "nə qədər ki"
| "modul" | "interfeys" | "sadalama" | "struktur" ;
(* ------------------- İdxal / İxrac ---------------------------- *)
idxalElanı = "gətir" , idxalHədəfi ;
(* Qeyd: Azərbaycan dilinin `-dan` şəkilçisi AYRI token ola bilməz —
`riyaziyyatdan` bir identifikatordur və lekser şəkilçini ayıra bilməz
(`meydan` adlı modul sınardı). Ona görə seçmə idxal nöqtə-mötərizə
sintaksisi ilə yazılır: `gətir riyaziyyat.{kök, Pİ}` *)
idxalHədəfi = modulYolu , [ "kimi" , identifikator ]
| modulYolu , "." , "{" , idxalSiyahısı , "}"
| modulYolu , "." , "*" ;
idxalSiyahısı = idxalElementi , { "," , idxalElementi } ;
idxalElementi = identifikator , [ "kimi" , identifikator ] ;
modulYolu = identifikator , { "." , identifikator }
| mətnLiteral ;
ixracElanı = "ixrac" , "et" , ( [ "standart" ] , elan
| "{" , idxalSiyahısı , "}"
| "*" , modulYolu , "dan" ) ;
(* ====================== 3. ELANLAR ============================ *)
elan = dəyişənElanı
| funksiyaElanı
| sinifElanı
| strukturElanı
| interfeysElanı
| sadalamaElanı
| modulElanı
| tipAliası
| genişlətmə
| obyektElanı ;
görünüş = "açıq" | "gizli" | "qorunan" | "modul" ;
(* --------------------- Dəyişənlər ----------------------------- *)
dəyişənElanı = [ görünüş ] , dəyişənNövü , bağlamaSiyahısı ,
[ ":" , tip ] , [ "=" , ifadəSiyahısı ] ;
dəyişənNövü = "dəyişən" | "sabit" | "dəyişməz" ;
bağlamaSiyahısı = bağlama , { "," , bağlama } ;
bağlama = identifikator
| "_"
| "..." , identifikator
| "(" , bağlamaSiyahısı , ")"
| "{" , sahəBağlaması , { "," , sahəBağlaması } , "}" ;
sahəBağlaması = identifikator , [ ":" , bağlama ] ;
(* --------------------- Funksiyalar ---------------------------- *)
funksiyaElanı = [ annotasiyalar ] , [ görünüş ] , [ "asinxron" ] ,
[ "generator" ] , "funksiya" , identifikator ,
[ generikParametrlər ] , "(" , [ parametrSiyahısı ] , ")" ,
[ "->" , tip ] , blok , son ;
parametrSiyahısı= parametr , { "," , parametr }
| parametr , { "," , parametr } , "," , "*" ,
"," , parametr , { "," , parametr } ;
parametr = [ "..." | "**" ] , identifikator , [ ":" , tip ] ,
[ "=" , ifadə ]
| görünüş , "xassə" , identifikator , ":" , tip ;
generikParametrlər = "[" , generikParametr , { "," , generikParametr } , "]" ;
generikParametr = identifikator , [ ":" , tipMəhdudiyyəti ] ;
tipMəhdudiyyəti = tip , { "və" , tip } ;
annotasiyalar = { "@" , identifikator , [ "(" , [ arqumentSiyahısı ] , ")" ] } ;
(* ----------------------- Siniflər ----------------------------- *)
sinifElanı = [ annotasiyalar ] , [ görünüş ] , [ "mücərrəd" | "son" ] ,
"sinif" , identifikator , [ generikParametrlər ] ,
[ "miras" , tip ] ,
[ "tətbiq" , tip , { "," , tip } ] ,
[ "ilə" , tip , { "," , tip } ] ,
{ sinifÜzvü } , son ;
sinifÜzvü = xassəElanı
| metodElanı
| qurucuElanı
| dağıdıcıElanı
| elan ;
xassəElanı = [ annotasiyalar ] , [ görünüş ] , [ "statik" ] ,
[ "sabit" | "tənbəl" ] , "xassə" , identifikator ,
":" , tip , [ "=" , ifadə ] ,
[ xassəAksessorları ] ;
xassəAksessorları = { ( "oxu" | "yaz" , [ "(" , identifikator , ")" ] ) ,
blok , son } , son ;
metodElanı = [ annotasiyalar ] , [ görünüş ] ,
[ "statik" | "mücərrəd" | "son" ] ,
[ "əvəz" , "et" ] , [ "asinxron" ] , [ "generator" ] ,
"metod" , identifikator , [ generikParametrlər ] ,
"(" , [ parametrSiyahısı ] , ")" , [ "->" , tip ] ,
( blok , son | ?mücərrəd: gövdə yoxdur? ) ;
qurucuElanı = [ görünüş ] , "qurucu" , [ identifikator ] ,
"(" , [ parametrSiyahısı ] , ")" ,
[ blok ] , [ son ] ;
dağıdıcıElanı = "silinsin" , "(" , ")" , blok , son ;
strukturElanı = [ görünüş ] , "struktur" , identifikator ,
[ generikParametrlər ] ,
[ "tətbiq" , tip , { "," , tip } ] ,
{ sinifÜzvü } , son ;
interfeysElanı = [ görünüş ] , "interfeys" , identifikator ,
[ generikParametrlər ] , [ "miras" , tip , { "," , tip } ] ,
{ interfeysÜzvü } , son ;
interfeysÜzvü = "metod" , identifikator , "(" , [ parametrSiyahısı ] , ")" ,
[ "->" , tip ] , [ blok , son ]
| "xassə" , identifikator , ":" , tip ;
obyektElanı = [ görünüş ] , "obyekt" , identifikator ,
{ sinifÜzvü } , son ;
genişlətmə = "genişlət" , tip , { sinifÜzvü } , son ;
qarışıqElanı = "qarışıq" , identifikator , { sinifÜzvü } , son ;
(* ---------------------- Sadalama ------------------------------ *)
sadalamaElanı = [ görünüş ] , "sadalama" , identifikator ,
[ generikParametrlər ] , [ ":" , tip ] ,
sadalamaVariantı , { sadalamaVariantı } ,
{ sinifÜzvü } , son ;
sadalamaVariantı= identifikator ,
[ "=" , ifadə
| "(" , [ arqumentSiyahısı | parametrSiyahısı ] , ")" ] ;
(* ------------------------ Modul ------------------------------- *)
modulElanı = [ görünüş ] , "modul" , identifikator ,
{ üstSəviyyəElement } , son ;
tipAliası = [ görünüş ] , "tip" , identifikator ,
[ generikParametrlər ] , "=" , tip ;
(* ======================= 4. TİPLƏR ============================ *)
tip = birləşməTipi ;
birləşməTipi = əsasTip , { "|" , əsasTip } ;
əsasTip = ( sadəTip | generikTip | funksiyaTipi
| kortejTipi | "(" , tip , ")" ) , [ "?" ] ;
sadəTip = "tam" | "onluq" | "mətn" | "məntiq" | "simvol"
| "bayt" | "istənilən" | "heç"
| identifikator , { "." , identifikator } ;
generikTip = sadəTip , "[" , tip , { "," , tip } , "]" ;
funksiyaTipi = "funksiyaTipi" , "(" , [ tip , { "," , tip } ] , ")" ,
[ "->" , tip ] ;
kortejTipi = "(" , tip , "," , [ tip , { "," , tip } ] , ")" ;
(* ===================== 5. İFADƏLƏR (statement) ================ *)
blok = { cümlə } ;
cümlə = elan
| ifadəCümləsi
| mənimsətmə
| şərtCümləsi
| varsaCümləsi
| yoxdursaCümləsi
| seçCümləsi
| nəQədərKiCümləsi
| həmişəCümləsi
| təkrarlaCümləsi
| hərCümləsi
| dayanCümləsi
| davamCümləsi
| qaytarCümləsi
| verCümləsi
| atCümləsi
| cəhdCümləsi
| iddiaCümləsi
| təminCümləsi
| gecikdirCümləsi
| istifadəCümləsi
| keçCümləsi
| qlobalCümləsi
| dayanNöqtəsi ;
ifadəCümləsi = ifadə ;
mənimsətmə = hədəfSiyahısı , mənimsətməOperatoru , ifadəSiyahısı
| hədəf , ( "++" | "--" ) ;
hədəfSiyahısı = hədəf , { "," , hədəf } ;
hədəf = identifikator
| ifadə , "." , identifikator
| ifadə , "[" , ifadə , "]"
| "_" ;
mənimsətməOperatoru = "=" | "+=" | "-=" | "*=" | "/=" | "~/=" | "%="
| "**=" | "&=" | "|=" | "^=" | "<<=" | ">>="
| "??=" | "?=" ;
(* --------------------- Şərt ----------------------------------- *)
şərtCümləsi = "əgər" , ifadə , "onda" , blok ,
{ ( "yoxsa" , "əgər" ) , ifadə , "onda" , blok } ,
[ ( "yoxsa" | "əks" , "halda" ) , blok ] , son ;
varsaCümləsi = "varsa" , varsaBağlaması , { "," , varsaBağlaması } ,
"onda" , blok ,
[ ( "yoxsa" | "əks" , "halda" ) , blok ] , son ;
varsaBağlaması = identifikator , "=" , ifadə | ifadə ;
yoxdursaCümləsi = "yoxdursa" , varsaBağlaması , { "," , varsaBağlaması } ,
"onda" , blok , son ;
(* --------------------- Seçim ---------------------------------- *)
seçCümləsi = "seç" , [ "tipi" ] , [ ifadə ] ,
{ halBəndi } , [ digərBəndi ] , son ;
halBəndi = "hal" , naxışSiyahısı , [ "əgər" , ifadə ] ,
( "→" , cümlə | blok ) , [ "keç" ] ;
digərBəndi = "digər" , "hallarda" , ( "→" , cümlə | blok ) ;
naxışSiyahısı = naxış , { "," , naxış } ;
naxış = literal
| identifikator
| "_"
| tip
| diapazonNaxışı
| kortejNaxışı
| siyahıNaxışı
| obyektNaxışı ;
diapazonNaxışı = ifadə , ( ".." | "..<" ) , ifadə ;
kortejNaxışı = "(" , [ naxış , { "," , naxış } ] , ")" ;
siyahıNaxışı = "[" , [ naxış , { "," , naxış } ,
[ "," , "..." , identifikator ] ] , "]" ;
obyektNaxışı = tip , "{" , [ sahəNaxışı , { "," , sahəNaxışı } ] , "}" ;
sahəNaxışı = identifikator , [ ":" , naxış ] ;
(* --------------------- Dövrlər -------------------------------- *)
nəQədərKiCümləsi= [ etiket , ":" ] , "nə" , "qədər" , "ki" , ifadə ,
blok , son ;
həmişəCümləsi = [ etiket , ":" ] , "həmişə" , blok , son ;
təkrarlaCümləsi = [ etiket , ":" ] , "təkrarla" ,
( [ identifikator , "," ] , ifadə , "dəfə" , blok , son
| blok , "nə" , "qədər" , "ki" , ifadə ) ;
hərCümləsi = [ etiket , ":" ] , "hər" , bağlamaSiyahısı , "üçün" ,
ifadə , [ "addım" , ifadə ] , "içində" , [ "gözlə" ] ,
[ "əgər" , ifadə ] , blok ,
[ "yoxsa" , blok ] , son
(* alternativ söz sırası; `əgər` filtri `üçün` ilə eyni sətirdə *)
| ifadə , "içində" , "hər" , bağlamaSiyahısı , "üçün" ,
[ "əgər" , ifadə ] , blok , [ "yoxsa" , blok ] , son ;
etiket = identifikator ;
dayanCümləsi = "dayan" , [ etiket ] ;
davamCümləsi = "davam" , "et" , [ etiket ] ;
(* ----------------- Axın idarəsi / xətalar --------------------- *)
qaytarCümləsi = "qaytar" , [ ifadəSiyahısı ] ;
verCümləsi = "ver" , [ ifadə ] ;
atCümləsi = "at" , [ ifadə ] ;
keçCümləsi = "keç" ;
qlobalCümləsi = "global" , identifikator , { "," , identifikator } ;
dayanNöqtəsi = "dayanNöqtəsi" ;
cəhdCümləsi = "cəhd" , "et" , blok ,
{ "tut" , [ "(" , identifikator , ":" , tip , ")" ] ,
[ "əgər" , ifadə ] , blok } ,
[ "nəhayət" , blok ] , son ;
iddiaCümləsi = "iddia" , ifadə , [ "," , ifadə ] ;
təminCümləsi = "təmin" , ifadə , "yoxsa" , blok , son ;
gecikdirCümləsi = "gecikdir" , ifadə ;
istifadəCümləsi = "istifadə" , istifadəBağlaması ,
{ "," , istifadəBağlaması } , blok , son ;
istifadəBağlaması = identifikator , "=" , ifadə ;
(* ===================== 6. İFADƏLƏR (expression) =============== *)
(* Prioritet aşağıdan yuxarıya artır *)
ifadəSiyahısı = ifadə , { "," , ifadə } ;
ifadə = boruİfadəsi ;
boruİfadəsi = boşBirləşmə , { "|>" , boşBirləşmə } ;
boşBirləşmə = məntiqiYa , { "??" , məntiqiYa } ;
məntiqiYa = məntiqiVə , { ( "və" , "ya" | "||" ) , məntiqiVə } ;
məntiqiVə = bərabərlik , { ( "və" | "&&" ) , bərabərlik } ;
bərabərlik = müqayisə , { ( "==" | "!=" ) , müqayisə } ;
müqayisə = diapazon , { ( "<" | ">" | "<=" | ">=" | "<=>"
| "içindədir" | "tipidir" ) , diapazon }
| diapazon , [ "boş" , "deyil" | "boşdur" ] ;
diapazon = bitYa , [ ( ".." | "..<" ) , bitYa , [ "addım" , bitYa ] ] ;
bitYa = bitXor , { "|" , bitXor } ;
bitXor = bitVə , { "^" , bitVə } ;
bitVə = sürüşmə , { "&" , sürüşmə } ;
sürüşmə = toplama , { ( "<<" | ">>" | ">>>" ) , toplama } ;
toplama = vurma , { ( "+" | "-" ) , vurma } ;
vurma = çevirmə , { ( "*" | "/" | "~/" | "%" ) , çevirmə } ;
çevirmə = təkOperand , { ( "kimi" | "kimi?" ) , tip } ;
təkOperand = ( "-" | "+" | "deyil" | "!" | "~" ) , təkOperand
| qüvvət ;
qüvvət = postfiks , [ "**" , təkOperand ] ; (* sağ assosiativ *)
postfiks = əsasİfadə , { postfiksSonluğu } ;
postfiksSonluğu = "." , identifikator
| "?." , identifikator
| "!"
| "." , tamLiteral (* kortej indeksi *)
| "(" , [ arqumentSiyahısı ] , ")"
| "[" , indeksİfadəsi , "]"
| "?" ; (* Nəticə yayma *)
indeksİfadəsi = ifadə
| [ ifadə ] , ( ".." | "..<" ) , [ ifadə ] ;
arqumentSiyahısı= arqument , { "," , arqument } ;
arqument = [ identifikator , ":" ] , ifadə
| "..." , ifadə ;
əsasİfadə = literal
| identifikator
| "özü"
| "üst"
| "(" , ifadə , ")"
| kortejİfadəsi
| siyahıİfadəsi
| lüğətİfadəsi
| dəstİfadəsi
| yeniİfadəsi
| lambdaİfadəsi
| anonimFunksiya
| şərtİfadəsi
| seçİfadəsi
| blokİfadəsi
| cəhdİfadəsi
| gözləİfadəsi
| qurma
| JSXElementi ;
literal = tamLiteral | onluqLiteral | mətnLiteral
| simvolLiteral | məntiqLiteral | boşLiteral ;
kortejİfadəsi = "(" , ")"
| "(" , ifadə , "," , ")"
| "(" , ifadə , "," , ifadəSiyahısı , [ "," ] , ")" ;
siyahıİfadəsi = "[" , [ elementSiyahısı , [ "," ] ] , "]" ;
elementSiyahısı = element , { "," , element } ;
element = ifadə | "..." , ifadə ;
lüğətİfadəsi = "{" , [ cüt , { "," , cüt } , [ "," ] ] , "}" ;
cüt = ifadə , ":" , ifadə | "..." , ifadə ;
dəstİfadəsi = "dəst" , "(" , [ ifadəSiyahısı ] , ")"
| "{" , ifadə , { "," , ifadə } , [ "," ] , "}" ;
yeniİfadəsi = "yeni" , tip , [ "." , identifikator ] ,
"(" , [ arqumentSiyahısı ] , ")" ;
lambdaİfadəsi = ( identifikator
| "(" , [ parametrSiyahısı ] , ")" ) ,
"=>" , ( ifadə | blokİfadəsi ) ;
anonimFunksiya = [ tutSiyahısı ] , [ "asinxron" ] , "funksiya" ,
"(" , [ parametrSiyahısı ] , ")" , [ "->" , tip ] ,
blok , son ;
tutSiyahısı = "[" , "tut" , identifikator , { "," , identifikator } , "]" ;
şərtİfadəsi = "əgər" , ifadə , "onda" , ifadə ,
{ "yoxsa" , "əgər" , ifadə , "onda" , ifadə } ,
"yoxsa" , ifadə , son ;
seçİfadəsi = seçCümləsi ; (* hər bənd dəyər verir *)
blokİfadəsi = "blok" , blok , son ; (* `ver` ilə dəyər qaytarır *)
cəhdİfadəsi = cəhdCümləsi ; (* `ver` ilə dəyər qaytarır *)
gözləİfadəsi = "gözlə" , ifadə ;
qurma = siyahıQurması | lüğətQurması | dəstQurması | generatorQurması ;
siyahıQurması = "[" , ifadə , "üçün" , bağlama , "içində" , ifadə ,
[ "əgər" , ifadə ] , "]" ;
lüğətQurması = "{" , ifadə , ":" , ifadə , "üçün" , bağlama ,
"içində" , ifadə , [ "əgər" , ifadə ] , "}" ;
dəstQurması = "{" , ifadə , "üçün" , bağlama , "içində" , ifadə ,
[ "əgər" , ifadə ] , "}" ;
generatorQurması= "(" , ifadə , "üçün" , bağlama , "içində" , ifadə ,
[ "əgər" , ifadə ] , ")" ;
(* ============ 7. İNTERFEYS SİNTAKSİSİ (JSX bənzəri) =========== *)
JSXElementi = "<" , JSXAdı , { JSXAtributu } , "/" , ">"
| "<" , JSXAdı , { JSXAtributu } , ">" ,
{ JSXUşağı } ,
"<" , "/" , JSXAdı , ">" ;
JSXAdı = identifikator , { "." , identifikator } ;
JSXAtributu = identifikator , [ "=" , ( mətnLiteral
| "{" , ifadə , "}" ) ]
| "{" , "..." , ifadə , "}" ;
JSXUşağı = JSXElementi
| "{" , ifadə , "}"
| ?mətn? ;
(* ================== 8. KOMPONENT / MAĞAZA ===================== *)
komponentElanı = [ görünüş ] , "komponent" , identifikator ,
{ komponentÜzvü } , son ;
komponentÜzvü = "vəziyyət" , identifikator , ":" , tip , [ "=" , ifadə ]
| "xassə" , identifikator , ":" , tip , [ "=" , ifadə ]
| "hadisə" , identifikator
| "hesablanan" , identifikator , ":" , tip , blok , son
| metodElanı
| "göstər" , "(" , ")" , blok , son ;
mağazaElanı = [ görünüş ] , "mağaza" , identifikator ,
{ mağazaÜzvü } , son ;
mağazaÜzvü = "vəziyyət" , identifikator , ":" , tip , [ "=" , ifadə ]
| "hesablanan" , identifikator , ":" , tip , blok , son
| [ "asinxron" ] , "əməl" , identifikator ,
"(" , [ parametrSiyahısı ] , ")" , blok , son ;
(* ===================== SON ==================================== *)